object which holds
* the list of returned results.
* @param {!HTMLPreElement} detailsControl The object which
* holds the details of the selected result.
*/
function decorateSearchControls(queryControl, statusControl,
resultsControl, detailsControl) {
var resultsDataModel = new cr.ui.ArrayDataModel([]);
// Decorate search box.
queryControl.onsearch = function() {
var query = queryControl.value;
statusControl.textContent = '';
resultsDataModel.splice(0, resultsDataModel.length);
if (!query) {
return;
}
statusControl.textContent = 'Searching for ' + query + '...';
queryControl.removeAttribute('error');
var timer = chrome.sync.makeTimer();
doSearch(query, function(nodes, error) {
if (error) {
statusControl.textContent = 'Error: ' + error;
queryControl.setAttribute('error');
} else {
statusControl.textContent =
'Found ' + nodes.length + ' nodes in ' +
timer.elapsedSeconds + 's';
queryControl.removeAttribute('error');
// TODO(akalin): Write a nicer list display.
for (var i = 0; i < nodes.length; ++i) {
nodes[i].toString = function() {
return this.NON_UNIQUE_NAME;
};
}
resultsDataModel.push.apply(resultsDataModel, nodes);
// Workaround for http://crbug.com/83452 .
resultsControl.redraw();
}
});
};
queryControl.value = '';
// Decorate results list.
cr.ui.List.decorate(resultsControl);
resultsControl.dataModel = resultsDataModel;
resultsControl.selectionModel.addEventListener('change', function(event) {
detailsControl.textContent = '';
var selected = resultsControl.selectedItem;
if (selected) {
detailsControl.textContent = JSON.stringify(selected, null, 2);
}
});
}
return {
decorateSearchControls: decorateSearchControls
};
});